//
//  main.c
//  Test
//
//  Created by wangrui on 14-9-22.
//  Copyright (c) 2014年 PPS. All rights reserved.
//


/*
	int arr1[3];
	int arr2[3];
	int arr3[3];
	
	int * ptr;
	
	// ptr1是一个指向 int [3] 的指针，即ptr的类型和&arr1的类型是一样的，注意：arr1指向的内存区域定长
	int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};
	
	// ptr2是一个指向 int * 的指针，即ptr2的类型和 &ptr 是一样的，注意：ptr指向的内存区域不定长
	int * ptr2[3]={arr1,arr2,arr3};
	
	// ptr3是一个指向 int [3] 的指针，即ptr3的类型和&arr1的类型是一样的，注意：arr1指向的内存区域定长
	int(* ptr3)[3]=&arr1;
	
	ptr3=ptr1; // 没错，他们的类型相同
 //	ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3]
	
	
	//ptr4是一个指向 int * 的指针，即ptr4的类型和&ptr是一样的，注意：ptr指向的内存区域不定长
	int ** ptr4;
 //	ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int **
	ptr4=ptr2; // 没错，他们的类型相同
 //	ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int **
	
 */


#include <stdio.h>

int main(int argc, const char * argv[]) {
	
	
	int c[3] = {1,5,9};
	
	printf("%p %d \n",c,*c);
	printf("%p %d \n",c+1,*(c+1));
	printf("%p %d \n",c+2,*(c+2));
	printf("%d \n",*c+1); //跟指向数组的指针 操作不是一回事
	
	printf("注意对比!!!!!!\n");
	int (*p1)[3] = &c;
	printf("%p \n",p1+1); //指向下一个大小为3的数组,超出界限
	printf("%p %d \n",*p1+1,*(*p1+1));
	
	printf("＝＝＝＝＝＝＝＝＝＝＝＝＝分割线＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n");
	
	int a[2][3] = {{1,2,3},{1,2,3}};
	
	int (*p)[3] = a; //int (*p)[2] = a; 这样有警告，要保证非第一维度的数字相等,p是指向数组的指针
	
	printf("size:%lu \n",sizeof(a));
	
	for (int i=0; i<2; i++) {
		for (int j=0; j<3; j++) {
			printf("%d(%p) ",a[i][j],&a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	
	printf("%p \n",a);
	printf("%p \n",p);
	printf("%p \n",p+1); //指向下一个大小为3的数组
	printf("\n");
	
	printf("%p \n",*p); //*p 指向第一个一维数组的第一个元素
	printf("%p \n",*p+1);
	printf("%p \n",*p+2);
	printf("\n");
	
	
	printf("%p \n",*(p+1));//*(p+1) 指向第二个一维数组的第一个元素
	printf("%p \n",*(p+1)+1);
	printf("%p \n",*(p+1)+2);
	printf("\n");
	
    return 0;
}
